/**
 * 格式化数值，避免浮点数精度问题
 * @param {number} num - 需要格式化的数值
 * @param {number} precision - 小数位数，默认为1
 * @returns {string} 格式化后的数值字符串
 */
function formatNumber(num, precision = 1) {
  // 对于整数，直接返回
  if (Number.isInteger(num)) {
    return num.toString()
  }
  // 对于小数，使用 toFixed 并移除末尾的0
  return parseFloat(num.toFixed(precision)).toString()
}

/**
 * 生成分箱规则配置
 * @param {number} type - 分箱类型 (1: 0.1间隔, 2: 10间隔, 3: 60间隔)
 * @returns {Array} 分箱规则数组，固定12条
 */
function generateBinRules(type) {
  const configs = {
    1: { step: 0.1, start: 0, end: 1, precision: 1 },
    2: { step: 10, start: 0, end: 100, precision: 0 },
    3: { step: 60, start: 300, end: 900, precision: 0 },
  }

  const config = configs[type]
  if (!config) {
    throw new Error(`不支持的分箱类型: ${type}`)
  }

  const { step, start, precision } = config
  const rules = []
  const totalBins = 12 // 固定生成12条数据

  // 生成第一个分箱 (-,start]
  rules.push({
    key: 'bin1',
    binRuleDetails: `(-,${formatNumber(start, precision)}]`,
    buildProportion: 0,
  })

  // 生成中间分箱 (总共10个中间分箱)
  let current = start
  for (let binIndex = 2; binIndex <= totalBins - 1; binIndex++) {
    const next = current + step
    rules.push({
      key: `bin${binIndex}`,
      binRuleDetails: `(${formatNumber(current, precision)},${formatNumber(next, precision)}]`,
      buildProportion: 0,
    })
    current = next
  }

  // 生成最后一个分箱 (第12个分箱)
  rules.push({
    key: `bin${totalBins}`,
    binRuleDetails: `(${formatNumber(current, precision)},+)`,
    buildProportion: 0,
  })

  return rules
}

/**
 * 生成所有分箱规则映射
 * @returns {Object} 包含所有分箱规则的映射对象
 */
function generateRuleInitMap() {
  return {
    1: generateBinRules(1), // 0.1间隔的分箱，12条
    2: generateBinRules(2), // 10间隔的分箱，12条
    3: generateBinRules(3), // 60间隔的分箱，12条
  }
}

// 导出生成的规则映射
export const ruleInitMap = generateRuleInitMap()

// 如果需要动态添加新的分箱类型，可以使用以下函数
export function addBinRuleType(type, step, start, end, precision = 1) {
  const rules = []
  const totalBins = 12

  // 生成第一个分箱
  rules.push({
    key: 'bin1',
    binRuleDetails: `(-,${formatNumber(start, precision)}]`,
    buildProportion: 0,
  })

  // 生成中间分箱
  let current = start
  for (let binIndex = 2; binIndex <= totalBins - 1; binIndex++) {
    const next = current + step
    rules.push({
      key: `bin${binIndex}`,
      binRuleDetails: `(${formatNumber(current, precision)},${formatNumber(next, precision)}]`,
      buildProportion: 0,
    })
    current = next
  }

  // 生成最后一个分箱
  rules.push({
    key: `bin${totalBins}`,
    binRuleDetails: `(${formatNumber(current, precision)},+)`,
    buildProportion: 0,
  })

  ruleInitMap[type] = rules
  return rules
}

const approvalStatusMap = {
  0: '待审核',
  1: '审核通过',
  2: '审核拒绝',
}

const approvalTypeMap = {
  online: {
    python: '01', // python上线
    pmml: '11', // pmml上线
    scorecard: '21', // 评分卡上线
  },
  offline: {
    python: '02', // python下线
    pmml: '12', // pmml下线
    scorecard: '22', // 评分卡下线
  },
  delete: {
    python: '00', // python删除
    pmml: '10', // pmml删除
    scorecard: '20', // 评分卡删除
  },
}
// 导出生成函数，便于测试和扩展
export { generateBinRules, generateRuleInitMap, formatNumber, approvalStatusMap, approvalTypeMap }
